import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;
public class Test{
    public static void main(String[] args)  {
        /* 1. 基本 CRUD 演示 */
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 3);          // 增/改
        map.put("banana", 2);
        map.put("pear", 5);
        System.out.println("初始map: " + map);   // {apple=3, banana=2, pear=5}

        System.out.println("apple数量: " + map.get("apple")); // 3
        System.out.println("orange数量: " + map.getOrDefault("orange", 0)); // 安全读，默认0

        map.remove("banana");         // 删key
        System.out.println("删后map: " + map);   // {apple=3, pear=5}

        /* 2. 批量插入与合并 */
        Map<String, Integer> other = Map.of("apple", 7, "grape", 9);
        other.forEach((k, v) -> map.merge(k, v, Integer::sum)); // apple=3+7=10
        System.out.println("合并后: " + map);   // {apple=10, pear=5, grape=9}

        /* 3. 遍历三种姿势 */
        // 3.1 经典 entrySet
        for (Map.Entry<String, Integer> e : map.entrySet()) {
            System.out.printf("%s=%d ", e.getKey(), e.getValue());
        }
        System.out.println();

        // 3.2 Java 8 forEach + lambda
        map.forEach((k, v) -> System.out.printf("%s=%d ", k, v));
        System.out.println();

        // 3.3 只遍历key或value
        map.keySet().forEach(k -> System.out.print(k + " "));
        System.out.println();
        map.values().forEach(v -> System.out.print(v + " "));
        System.out.println();

        /* 4. 数组/Map互转 */
        // 4.1 数组 → Map（Java 8 Stream）
        String[] fruits = {"apple", "banana", "apple"};
        Map<String, Long> count =
            Arrays.stream(fruits)
                  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.out.println("水果计数: " + count); // {apple=2, banana=1}

        // 4.2 Map → 数组
        String[] keys = map.keySet().toArray(String[]::new);
        Integer[] values = map.values().toArray(Integer[]::new);
        System.out.println("keys: " + Arrays.toString(keys));
        System.out.println("values: " + Arrays.toString(values));
    }
}
// HashMap 常用方法
// | 目的        | 方法                                                                 | 示例                                                     |
// | --------- | ------------------------------------------------------------------ | ------------------------------------------------------ |
// | 插入/更新     | `V put(K k, V v)`                                                  | `map.put("A", 1);`                                     |
// | 安全读取      | `V getOrDefault(K k, V def)`                                       | `int n = map.getOrDefault("B", 0);`                    |
// | 删除        | `V remove(K k)`                                                    | `map.remove("A");`                                     |
// | 批量插入      | `void putAll(Map<? extends K,? extends V> m)`                      | `map.putAll(otherMap);`                                |
// | ★ 无则插入    | `V putIfAbsent(K k, V v)`                                          | `map.putIfAbsent("A", 0);`                             |
// | ★ 原子合并    | `V merge(K k, V v, BiFunction<? super V,? super V,? extends V> f)` | `map.merge("A", 1, Integer::sum);`                     |
// | ★ 原子计算    | `V compute(K k, BiFunction<? super K,? super V,? extends V> f)`    | `map.compute("A", (k,v)-> v==null?1:v+1);`             |
// | 是否含 key   | `boolean containsKey(Object k)`                                    | `if (map.containsKey("A")) …`                          |
// | 是否含 value | `boolean containsValue(Object v)`                                  | `if (map.containsValue(1)) …`                          |
// | 大小/判空     | `int size()` / `boolean isEmpty()`                                 | `map.size()` / `map.isEmpty()`                         |
// | 清空        | `void clear()`                                                     | `map.clear();`                                         |
// | 遍历 entry  | `Set<Map.Entry<K,V>> entrySet()`                                   | `for (Map.Entry<String,Integer> e : map.entrySet()) …` |
// | 遍历 key    | `Set<K> keySet()`                                                  | `map.keySet().forEach(...);`                           |
// | 遍历 value  | `Collection<V> values()`                                           | `map.values().forEach(...);`                           |
// | ★ 函数式遍历   | `void forEach(BiConsumer<? super K,? super V> action)`             | `map.forEach((k,v)->System.out.println(k+":"+v));`     |
